/**
 * struct ListNode {
 *  int val;
 *  struct ListNode *next;
 *  ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可
     *
     *
     * @param lists ListNode类vector
     * @return ListNode类
     */
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        // write code here
        auto cmp = [](ListNode* a,ListNode* b)->bool {
            return a->val>b->val;//从小到大排序
        };//cmp是自动推导的，运行时才知道是什么数据类型
        priority_queue<ListNode*,vector<ListNode*>, decltype(cmp)> pq(cmp);
//        ListNode*,vector<ListNode*>, decltype(cmp)
//        ListNode*存储的数据类型是ListNode*
//        vector<ListNode*>，底层存储的数据结构使用vector
//        使用decltype去确定auto的自动推导的结果
        ListNode* ans = new ListNode(-1);
        auto node = ans;
        int n = lists.size();
        for(int i=0;i<n;i++){
            if(lists[i] != nullptr)
                pq.push(lists[i]);
        }
        while(!pq.empty()){
            auto top = pq.top();
            // cout<<top->val<<endl;
            pq.pop();
            node->next = top;
            top = top->next;//报空指针了
            node = node->next;
            if(top != nullptr){
                pq.push(top);
            }
        }
        return ans->next;
    }
};